home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / ddragon3.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  8KB  |  285 lines

  1. /***************************************************************************
  2.  
  3.   Video Hardware for Double Dragon 3
  4.  
  5. ***************************************************************************/
  6.  
  7. #include "driver.h"
  8. #include "vidhrdw/generic.h"
  9. #include "tilemap.h"
  10.  
  11. unsigned char *ddragon3_bg_videoram;
  12. static UINT16 ddragon3_bg_scrollx;
  13. static UINT16 ddragon3_bg_scrolly;
  14.  
  15. static UINT16 ddragon3_bg_tilebase;
  16. static UINT16 old_ddragon3_bg_tilebase;
  17.  
  18. unsigned char *ddragon3_fg_videoram;
  19. static UINT16 ddragon3_fg_scrollx;
  20. static UINT16 ddragon3_fg_scrolly;
  21. UINT16 ddragon3_vreg;
  22.  
  23. static struct tilemap *background, *foreground;
  24.  
  25. /* scroll write function */
  26. WRITE_HANDLER( ddragon3_scroll_w ){
  27.     switch (offset) {
  28.         case 0x0: /* Scroll X, BG1 */
  29.         ddragon3_fg_scrollx = data;
  30.         return;
  31.  
  32.         case 0x2: /* Scroll Y, BG1 */
  33.         ddragon3_fg_scrolly = data;
  34.         return;
  35.  
  36.         case 0x4: /* Scroll X, BG0 */
  37.         ddragon3_bg_scrollx = data;
  38.         return;
  39.  
  40.         case 0x6: /* Scroll Y, BG0 */
  41.         ddragon3_bg_scrolly = data;
  42.         return;
  43.  
  44.         case 0xc: /* BG Tile Base */
  45.         ddragon3_bg_tilebase = COMBINE_WORD(ddragon3_bg_tilebase, data)&0x1ff;
  46.         return;
  47.  
  48.         default:  /* Unknown */
  49.         logerror("OUTPUT c00[%02x] %02x \n", offset,data);
  50.         break;
  51.     }
  52. }
  53.  
  54. /* background */
  55. static void get_bg_tile_info(int tile_index)
  56. {
  57.     UINT16 data = ((UINT16 *)ddragon3_bg_videoram)[tile_index];
  58.     SET_TILE_INFO( 0, (data&0xfff) | ((ddragon3_bg_tilebase&1)<<12), ((data&0xf000)>>12)+16 );  // GFX,NUMBER,COLOR
  59. }
  60.  
  61. WRITE_HANDLER( ddragon3_bg_videoram_w )
  62. {
  63.     int oldword = READ_WORD(&ddragon3_bg_videoram[offset]);
  64.     int newword = COMBINE_WORD(oldword,data);
  65.     if( oldword != newword )
  66.     {
  67.         WRITE_WORD(&ddragon3_bg_videoram[offset],newword);
  68.         offset = offset/2;
  69.         tilemap_mark_tile_dirty(background,offset);
  70.     }
  71. }
  72.  
  73. READ_HANDLER( ddragon3_bg_videoram_r )
  74. {
  75.     return READ_WORD( &ddragon3_bg_videoram[offset] );
  76. }
  77.  
  78. /* foreground */
  79. static void get_fg_tile_info(int tile_index)
  80. {
  81.     UINT16 data0 = ((UINT16 *)ddragon3_fg_videoram)[2*tile_index];
  82.     UINT16 data1 = ((UINT16 *)ddragon3_fg_videoram)[2*tile_index+1];
  83.     SET_TILE_INFO( 0, data1&0x1fff , data0&0xf );  // GFX,NUMBER,COLOR
  84.         tile_info.flags = ((data0&0x40) >> 6);  // FLIPX
  85. }
  86.  
  87. WRITE_HANDLER( ddragon3_fg_videoram_w )
  88. {
  89.     int oldword = READ_WORD(&ddragon3_fg_videoram[offset]);
  90.     int newword = COMBINE_WORD(oldword,data);
  91.     if( oldword != newword )
  92.     {
  93.         WRITE_WORD(&ddragon3_fg_videoram[offset],newword);
  94.         offset = offset/4;
  95.         tilemap_mark_tile_dirty(foreground,offset);
  96.     }
  97. }
  98.  
  99. READ_HANDLER( ddragon3_fg_videoram_r )
  100. {
  101.     return READ_WORD( &ddragon3_fg_videoram[offset] );
  102. }
  103.  
  104. /* start & stop */
  105. int ddragon3_vh_start(void){
  106.     ddragon3_bg_tilebase = 0;
  107.     old_ddragon3_bg_tilebase = -1;
  108.  
  109.     background = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     16,16,32,32);
  110.     foreground = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
  111.  
  112.     if (!background || !foreground)
  113.         return 1;
  114.  
  115.     foreground->transparent_pen = 0;
  116.     return 0;
  117. }
  118.  
  119. /*
  120.  * Sprite Format
  121.  * ----------------------------------
  122.  *
  123.  * Word | Bit(s)           | Use
  124.  * -----+-fedcba9876543210-+----------------
  125.  *   0    | --------xxxxxxxx | ypos (signed)
  126.  * -----+------------------+
  127.  *   1    | --------xxx----- | height
  128.  *   1  | -----------xx--- | yflip, xflip
  129.  *   1  | -------------x-- | msb x
  130.  *   1  | --------------x- | msb y?
  131.  *   1  | ---------------x | enable
  132.  * -----+------------------+
  133.  *   2  | --------xxxxxxxx | tile number
  134.  * -----+------------------+
  135.  *   3  | --------xxxxxxxx | bank
  136.  * -----+------------------+
  137.  *   4  | ------------xxxx |color
  138.  * -----+------------------+
  139.  *   5  | --------xxxxxxxx | xpos
  140.  * -----+------------------+
  141.  *   6,7| unused
  142.  */
  143.  
  144. static void draw_sprites( struct osd_bitmap *bitmap ){
  145.     const struct rectangle *clip = &Machine->drv->visible_area;
  146.     const struct GfxElement *gfx = Machine->gfx[1];
  147.     UINT16 *source = (UINT16 *)spriteram;
  148.     UINT16 *finish = source+0x800;
  149.  
  150.     while( source<finish ){
  151.         UINT16 attributes = source[1];
  152.         if( attributes&0x01 ){ /* enable */
  153.             int flipx = attributes&0x10;
  154.             int flipy = attributes&0x08;
  155.             int height = (attributes>>5)&0x7;
  156.  
  157.             int sy = source[0]&0xff;
  158.             int sx = source[5]&0xff;
  159.             UINT16 tile_number = source[2]&0xff;
  160.             UINT16 color = source[4]&0xf;
  161.             int bank = source[3]&0xff;
  162.             int i;
  163.  
  164.             if (attributes&0x04) sx|=0x100;
  165.             if (attributes&0x02) sy=239+(0x100-sy); else sy=240-sy;
  166.             if (sx>0x17f) sx=0-(0x200-sx);
  167.  
  168.             tile_number += (bank*256);
  169.  
  170.             for( i=0; i<=height; i++ ){
  171.                 int tile_index = tile_number + i;
  172.  
  173.                 drawgfx(bitmap,gfx,
  174.                     tile_index,
  175.                     color,
  176.                     flipx,flipy,
  177.                     sx,sy-i*16,
  178.                     clip,TRANSPARENCY_PEN,0);
  179.             }
  180.         }
  181.         source+=8;
  182.     }
  183. }
  184.  
  185. static void mark_sprite_colors( void )
  186. {
  187.     int offs,color,i,pal_base,sprite,multi,attr;
  188.     int colmask[16];
  189.     unsigned int *pen_usage; /* Save some struct derefs */
  190.  
  191.     /* Sprites */
  192.     pal_base = Machine->drv->gfxdecodeinfo[1].color_codes_start;
  193.     pen_usage=Machine->gfx[1]->pen_usage;
  194.     for (color = 0;color < 16;color++) colmask[color] = 0;
  195.     for (offs = 0;offs < 0x1000;offs += 16)
  196.     {
  197.         attr = READ_WORD (&spriteram[offs+2]);
  198.         if (!(attr&1)) continue;
  199.  
  200.         multi = (attr>>5)&0x7;
  201.         sprite = READ_WORD (&spriteram[offs+4]) & 0xff;
  202.         sprite += ((READ_WORD (&spriteram[offs+6]) & 0xff)<<8);
  203.         color = READ_WORD (&spriteram[offs+8]) & 0xf;
  204.  
  205.         while (multi >= 0)
  206.         {
  207.             colmask[color] |= pen_usage[sprite + multi];
  208.             multi--;
  209.         }
  210.     }
  211.  
  212.     for (color = 0;color < 16;color++)
  213.     {
  214.         for (i = 1;i < 16;i++)
  215.         {
  216.             if (colmask[color] & (1 << i))
  217.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  218.         }
  219.     }
  220. }
  221.  
  222. void ddragon3_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  223. {
  224.     if( ddragon3_bg_tilebase != old_ddragon3_bg_tilebase )
  225.     {
  226.         old_ddragon3_bg_tilebase = ddragon3_bg_tilebase;
  227.         tilemap_mark_all_tiles_dirty( background );
  228.     }
  229.  
  230.     tilemap_set_scrolly( background, 0, ddragon3_bg_scrolly );
  231.     tilemap_set_scrollx( background, 0, ddragon3_bg_scrollx );
  232.  
  233.     tilemap_set_scrolly( foreground, 0, ddragon3_fg_scrolly );
  234.     tilemap_set_scrollx( foreground, 0, ddragon3_fg_scrollx );
  235.  
  236.     tilemap_update( background );
  237.     tilemap_update( foreground );
  238.  
  239.     palette_init_used_colors();
  240.     mark_sprite_colors();
  241.     if( palette_recalc() ) tilemap_mark_all_pixels_dirty( ALL_TILEMAPS );
  242.  
  243.     tilemap_render( background );
  244.     tilemap_render( foreground );
  245.  
  246.     if (ddragon3_vreg&0x40) {
  247.         tilemap_draw( bitmap, background, 0 );
  248.         tilemap_draw( bitmap, foreground, 0 );
  249.         draw_sprites( bitmap );
  250.     }
  251.     else {
  252.         tilemap_draw( bitmap, background, 0 );
  253.         draw_sprites( bitmap );
  254.         tilemap_draw( bitmap, foreground, 0 );
  255.     }
  256. }
  257.  
  258. void ctribe_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  259. {
  260.     if( ddragon3_bg_tilebase != old_ddragon3_bg_tilebase )
  261.     {
  262.         old_ddragon3_bg_tilebase = ddragon3_bg_tilebase;
  263.         tilemap_mark_all_tiles_dirty( background );
  264.     }
  265.  
  266.     tilemap_set_scrolly( background, 0, ddragon3_bg_scrolly );
  267.     tilemap_set_scrollx( background, 0, ddragon3_bg_scrollx );
  268.     tilemap_set_scrolly( foreground, 0, ddragon3_fg_scrolly );
  269.     tilemap_set_scrollx( foreground, 0, ddragon3_fg_scrollx );
  270.  
  271.     tilemap_update( background );
  272.     tilemap_update( foreground );
  273.  
  274.     palette_init_used_colors();
  275.     mark_sprite_colors();
  276.     if( palette_recalc() ) tilemap_mark_all_pixels_dirty( ALL_TILEMAPS );
  277.  
  278.     tilemap_render( background );
  279.     tilemap_render( foreground );
  280.  
  281.     tilemap_draw( bitmap, background, 0 );
  282.     tilemap_draw( bitmap, foreground, 0 );
  283.     draw_sprites( bitmap );
  284. }
  285.